package org.moore.utils;

import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
import java.net.URL;


// 音乐工具类
public class MusicUtils {
    //管理音频剪辑
    private Clip clip;
    // 创建一个 SoundPlayer 实例，加载音频文件并准备播放
    public MusicUtils(String filePath) {
        try {
            File audioFile = new File(filePath);
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(audioFile);
            clip = AudioSystem.getClip();
            clip.open(audioInputStream);
        } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
            e.printStackTrace();
        }
    }

    // 创建一个 SoundPlayer 实例，加载音频文件并准备播放
    public MusicUtils(URL fileURL) {
        try {
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(fileURL);
            clip = AudioSystem.getClip();
            clip.open(audioInputStream);
        } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
            e.printStackTrace();
        }
    }

    // 播放音频，从头开始播放
    public void play() {
        if (clip != null) {
            stop(); // 如果仍在播放，则停止
            clip.setFramePosition(0); // 从头开始
            clip.start(); // 开始播放
        }
    }

    // 停止音频播放
    public void stop() {
        if (clip != null && clip.isRunning()) {
            clip.stop(); // 停止播放
        }
    }

    // 暂停音频播放
    public void pause() {
        if (clip != null && clip.isRunning()) {
            clip.stop(); // 暂停播放
        }
    }

    // 恢复音频播放（从暂停状态）
    public void resume() {
        if (clip != null && !clip.isRunning()) {
            clip.start(); // 恢复播放
        }
    }

    // 设置音频的音量
    public void setVolume(float volume) {
        if (clip != null) {
            if (volume < 0f || volume > 1f) {
                throw new IllegalArgumentException("音量应在 0 到 1 之间");
            }
            FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
            float dB = (float) (Math.log(volume) / Math.log(10.0) * 20.0);
            gainControl.setValue(dB);
        }
    }

    // 释放音频资源。在不再需要播放器时调用
    public void close() {
        if (clip != null) {
            clip.close(); // 释放资源
        }
    }

    // 启用或禁用循环播放
    public void setLoop(boolean loop) {
        if (clip != null) {
            clip.loop(loop ? Clip.LOOP_CONTINUOUSLY : 0);
        }
    }
}
